1950G - Shuffling Songs - CodeForces Solution


bitmasks dp graphs implementation strings

Please click on ads to support us..

Python Code:

import sys
from functools import lru_cache
input = sys.stdin.readline

def inp():
    return(int(input()))
def inlt():
    return(list(map(int,input().split())))
def insr():
    s = input()
    return(list(s[:len(s) - 1]))
def invr():
    return(map(int,input().split()))

def bit_length(i):
    s = bin(i)           s = s.lstrip('-0b')     return len(s)

def main():
    m = inp()
    lis = []
    for _ in range(m):
        lis.append(input().split())
    edge = [[0] * m for _ in range(m)]
    for i in range(m):
        for j in range(i + 1, m):
            if lis[i][0] == lis[j][0] or lis[i][1] == lis[j][1]:
                edge[i][j] = 1
                edge[j][i] = 1

    @lru_cache(None)
    def dfs(mask, last = -1):
        tmp  = 0
        for i in range(m):
            if last == -1:
                tmp = max(tmp, dfs(mask | (1 << i), i))

            elif mask & (1 << i) == 0 and edge[last][i] == 1:
                tmp = max(tmp, dfs(mask | (1 << i), i))
        return tmp if tmp != 0 else bin(mask).count('1')


    
    print(m - dfs(0))


if __name__ == "__main__":
    n = inp()
    for i in range(n):
        main()


Comments

Submit
0 Comments
More Questions

507B - Amr and Pins
379A - New Year Candles
1154A - Restoring Three Numbers
750A - New Year and Hurry
705A - Hulk
492B - Vanya and Lanterns
1374C - Move Brackets
1476A - K-divisible Sum
1333A - Little Artem
432D - Prefixes and Suffixes
486A - Calculating Function
1373B - 01 Game
1187A - Stickers and Toys
313B - Ilya and Queries
579A - Raising Bacteria
723A - The New Year Meeting Friends
302A - Eugeny and Array
1638B - Odd Swap Sort
1370C - Number Game
1206B - Make Product Equal One
131A - cAPS lOCK
1635A - Min Or Sum
474A - Keyboard
1343A - Candies
1343C - Alternating Subsequence
1325A - EhAb AnD gCd
746A - Compote
318A - Even Odds
550B - Preparing Olympiad
939B - Hamster Farm